{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-01-06T07:10:50.203907900Z",
     "start_time": "2024-01-06T07:10:44.885499Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at data/bert-base-chinese and are newly initialized: ['classifier.weight', 'classifier.bias']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    }
   ],
   "source": [
    "from transformers import AutoTokenizer, AutoModelForMaskedLM, BertModel, AutoModelForSequenceClassification\n",
    "from transformers import pipeline\n",
    "import torch \n",
    "import transformers\n",
    "import numpy\n",
    "from matplotlib import pyplot as plt\n",
    "from dataset_extractor import *\n",
    "tokenizer=AutoTokenizer.from_pretrained('data/bert-base-chinese')\n",
    "#model=BertModel.from_pretrained('data/bert-base-chinese')\n",
    "model_cls=AutoModelForSequenceClassification.from_pretrained('data/bert-base-chinese',num_labels=202)\n",
    "#maskfill=pipeline(task=\"fill-mask\",model='data/bert-base-chinese')\n",
    "#print(maskfill(\"加州位于美国的[MASK]部\"))\n",
    "#token=tokenizer(sentence)\n",
    "#print(token)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "词典大小: 21128\n",
      "英文分词： ['the', 'game', 'has', 'go', '##ne', '!', 'u', '##na', '##ff', '##able', '[UNK]', 'have', 'a', 'new', '[UNK]', '!']\n",
      "中文分词： ['我', '爱', '北', '京', '天', '安', '门', '，', '[UNK]', '[UNK]']\n",
      "id-token转换: [2769, 4263, 1266, 776, 1921, 2128, 7305, 8024, 100, 100]\n",
      "多句子encode： {'input_ids': [101, 151, 8993, 8357, 11677, 8370, 102, 10288, 9059, 8913, 8175, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}\n",
      "decode： [CLS] i like you much [SEP] but not him [SEP]\n"
     ]
    }
   ],
   "source": [
    "print(\"词典大小:\",tokenizer.vocab_size)\n",
    "text = \"the game has gone!unaffable  I have a new GPU!\"\n",
    "tokens = tokenizer.tokenize(text)\n",
    "print(\"英文分词：\",tokens)\n",
    "\n",
    "\n",
    "text = \"我爱北京天安门，吢吣\"\n",
    "tokens = tokenizer.tokenize(text)\n",
    "print(\"中文分词：\",tokens)\n",
    "\n",
    "input_ids = tokenizer.convert_tokens_to_ids(tokens)\n",
    "print(\"id-token转换:\",input_ids)\n",
    "\n",
    "\n",
    "sen_code = tokenizer.encode_plus(\"i like  you  much\", \"but not him\")\n",
    "print(\"多句子encode：\",sen_code)\n",
    "\n",
    "print(\"decode：\",tokenizer.decode(sen_code['input_ids']))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-06T07:11:21.799600500Z",
     "start_time": "2024-01-06T07:11:21.776553800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-01-06T07:11:51.494623500Z",
     "start_time": "2024-01-06T07:11:51.479624500Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_ids': [101, 872, 791, 1921, 1391, 749, 1408, 8024, 2769, 1391, 2130, 749, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}\n"
     ]
    }
   ],
   "source": [
    "import json as js\n",
    "sentence=\"你今天吃了吗，我吃完了\"\n",
    "tokens=tokenizer(sentence)\n",
    "print(tokens)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-01-06T07:11:55.183639200Z",
     "start_time": "2024-01-06T07:11:52.063304500Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "123216 lines have been extracted\n",
      "content:昌宁县4月19日下午16时许被告人段某驾拖车经过鸡飞乡澡塘街子时逢堵车段某将车停在“冰凉一夏”冷饮店门口被害人王某的侄子王2某示意段某靠边未果后上前敲打车门让段某离开段某遂驾车离开但对此心生怨愤同年4月21日22时许被告人段某酒后与其妻子王1某一起准备回家走到鸡飞乡澡塘街富达通讯手机店门口时停下段某进入手机店内对被害人王某进行吼骂紧接着从手机店出来拿得一个石头又冲进手机店内朝王某头部打去致王某右额部粉碎性骨折右眼眶骨骨折经鉴定被害人王某此次损伤程度为轻伤一级\n",
      "label:0\n",
      "articles:[234]\n",
      "punish_of_money:0\n",
      "criminals:['段某']\n",
      "death_penalty:False\n",
      "imprisonment:12\n",
      "life_imprisonment:False\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "train_pair=extract(\"data/dataset/cail/exercise_contest/data_train.json\")\n",
    "pair = {\"content\": [], \"label\": [], 'articles': [], 'punish_of_money': [], \"criminals\": [], \"death_penalty\": [],\n",
    "            \"imprisonment\": [], \"life_imprisonment\": []}\n",
    "for key in pair.keys():\n",
    "    print(f\"{key}:{train_pair[key][0]}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-12-11T12:48:42.694277500Z",
     "start_time": "2023-12-11T12:48:42.581626Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "257\n",
      "苏州市吴中区被告人张某于6月7日下午伙同他人经事先预谋至苏州市吴中区木渎镇尧峰公墓尧峰石材厂附近一个枇杷园的民房中持木棍殴打被害人吴某等人致被害人吴某左手臂受伤经法医鉴定被害人吴某因外伤致左尺骨干中下段骨折属人体轻伤二级公诉机关为证实上述事实提供了有关证据公诉机关认为被告人张某的行为已触犯中华人民共和国刑法××××之规定构成××罪并系主犯 0\n",
      "123216\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "string_lengths = [len(s) for s in train_pair[\"content\"]]\n",
    "count=sum([1 for s in train_pair[\"content\"] if len(s) < 512])\n",
    "max_length = np.argmax(string_lengths[:1000])\n",
    "print(train_pair[\"content\"][250],train_pair[\"label\"][250])\n",
    "plt.scatter(range(10000),string_lengths[:10000])\n",
    "plt.xlabel('length')\n",
    "plt.ylabel('freq')\n",
    "plt.title('distribute')\n",
    "print(count)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-12-11T13:51:39.000933400Z",
     "start_time": "2023-12-11T13:49:27.935250900Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0])\n"
     ]
    }
   ],
   "source": [
    "from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler\n",
    "batch_size=40\n",
    "train_batch=tokenizer(train_pair[\"content\"],max_length=512,truncation=True,padding=\"max_length\",return_tensors=\"pt\")\n",
    "train=TensorDataset(train_batch[\"input_ids\"],train_batch[\"attention_mask\"],torch.tensor(train_pair[\"label\"]))\n",
    "train_sampler=RandomSampler(train)\n",
    "train_dataloader=DataLoader(train,sampler=train_sampler,batch_size=batch_size)\n",
    "from torch.optim import AdamW\n",
    "optimizer=AdamW(model_cls.parameters(),lr=2e-5)\n",
    "num_epochs=8\n",
    "from transformers import get_scheduler\n",
    "num_training_steps = num_epochs * len(train_dataloader)\n",
    "lr_scheduler = get_scheduler(\n",
    "    name=\"linear\", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "device=torch.device(\"cuda\")\n",
    "def train(model):\n",
    "    model.to(device)\n",
    "    for epoch in range(num_epochs):\n",
    "        model.train() #切换成训练模式\n",
    "        total_loss=0\n",
    "        for step,batch in enumerate(train_dataloader):\n",
    "            if step % 10 == 0 and not step == 0:\n",
    "                print(\"step: \",step, \"  loss:\",total_loss/(step*batch_size))\n",
    "            b_input_ids=batch[0].to(device)\n",
    "            b_input_mask = batch[1].to(device)\n",
    "            b_labels = batch[2].to(device)\n",
    "            model.zero_grad()\n",
    "            outputs = model(b_input_ids, \n",
    "                        token_type_ids=None, \n",
    "                        attention_mask=b_input_mask, \n",
    "                        labels=b_labels)\n",
    "            loss = outputs.loss     # include cross-entropy loss   \n",
    "            total_loss += loss.item()\n",
    "            loss.backward()\n",
    "            torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) #防止梯度爆炸\n",
    "            optimizer.step()\n",
    "            lr_scheduler.step()\n",
    "        avg_train_loss = total_loss / len(train_dataloader)      \n",
    "        print(\"avg_loss:\",avg_train_loss)\n",
    "        model.save_pretrained(f\"data/bert-base-legal-chinese-epoch-{epoch+1}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "train(model_cls)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "name": "cail-gpu",
   "language": "python",
   "display_name": "cail-gpu"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
